package com.atguigu.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 *使用RabbitMq
 * 1、引入amqp场景，RabbitAutoConfiguration就会自动生效
 * 2、给容器中自动配置
 *		CachingConnectionFactory RabbitTemplate AmqpAdmin RabbitMessagingTemplate
 * 3、RabbitMq 源码 使用的配置文件RabbitProperties @ConfigurationProperties(prefix = "spring.rabbitmq")
 * 4、开启RabbitMq注解@EnableRabbit : @EnableXXX
 * 5、监听消息：
 * 		使用@RabbitListener 必须开启 @EnableRabbit
 * 		使用@RabbitHandler：类+方法上 （监听哪些队列）
 * 		使用@RabbitHandler：标在方法上（重载区分不同的消息）
 *
 *
 * 6、本地事务失效问题
 * 在同一个类里面，编写两个方法，内部调用的时候，会导致事务设置失效。原因是没有用到代理对象的缘故。
 * 解决：使用代理对象来调用事务方法
 * 0）、导入 spring-boot-starter-aop 引入aspectj
 * 1）、@EnableTransactionManagement(proxyTargetClass = true)，开启动态代理功能，以后所有的动态代理都是aspectj，proxyTargetClass = true对外暴露代理对象
 * 2）、@EnableAspectJAutoProxy(exposeProxy=true) 开启
 * 3）、AopContext.currentProxy() 调用方法
 *
 * 7、Seata控制分布式事务
 * 1）、SEATA AT 模式需要 UNDO_LOG 表，给谷粒商城每个服务添加回滚日志表undo_log
 * 2）、安装seata-server： https://github.com/seata/seata/releases,下载服务器软件包，将其解压缩。
 * 3）、新增依赖
 * 			<dependency>
 *             <groupId>com.alibaba.cloud</groupId>
 *             <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
 *         </dependency>
 *     注意：不仅导入了spring-cloud-starter-alibaba-seata:2.1.0.RELEASE，还导入了io.seata:seata-all:0.7.1，所以我们下载的seata服务端就需要是0.7.1版本的
 * 4)、修改registery.cof配置文件使用nacos作为配置中心
 *
 * 8、调用服务开启一个总事务：@GlobalTransactional同时还需要加上@Transactional
 * 		1）注入一个配置类MySeataConfig
 * 		2）resources目录下添加file.conf和registery.cof
 * 		3)被调用服务比如 product和ware 模块也需要上面操作，被调用的远程服务的方法	需要加上@Transactional代表是分支事务
 * 		4）修改seata文件
 */

@EnableAspectJAutoProxy(exposeProxy = true)
@EnableRedisHttpSession
@EnableRabbit
@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallOrderApplication {

	public static void main(String[] args) {
		try{
			SpringApplication.run(GulimallOrderApplication.class, args);
		}catch (Exception e){
			e.printStackTrace();
		}
	}

}
